package br.com.obardavez.util;

import java.io.Serializable;
import java.util.Date;

import br.com.obardavez.util.impl.DateUtilImpl;

import com.google.inject.ImplementedBy;

@ImplementedBy(DateUtilImpl.class)
public interface DateUtil extends Serializable{

	String getDefaultDatePattern();
	
	String getDefaultDatetimePattern();

	void setDefaultDatePattern(String defaultDatePattern);

	/**
	 * Formata a data informada para o formato padrão
	 * 
	 * @param date
	 *            Data a ser formatada.
	 * @return String que representa a data formatada.
	 */
	String format(Date date);

	/**
	 * Formata a data informada para o padrão "format"
	 * 
	 * @param date
	 *            Data a ser formatada.
	 * @param format
	 *            Formato a ser utilizado.
	 * @return String que representa a data formatada.
	 */
	String format(Date date, String format);

	/**
	 * Cria um objeto "Date" que representa a string "data".
	 * 
	 * @param date
	 *            Data a ser convertida.
	 * @return Objeto date com os atributos da data informada.
	 */
	Date parse(String date);

	/**
	 * Cria um objeto "Date" que representa a string "data" passada como
	 * parâmetro no formato representado pelo parâmetro "format".
	 * 
	 * @param date
	 *            Data a ser convertida.
	 * @param format
	 *            Formato da data informada.
	 * @return Objeto date com os atributos da data informada.
	 */
	Date parse(String date, String format);

	/**
	 * Verifica se a data passada por parâmetro é válida.
	 * 
	 * @param data
	 *            Texto representando a data que sera validada
	 * @param format
	 *            Formato da data
	 * @return Boolean que indica se a data esta valida
	 */
	Boolean isValid(String data, String format);
	
	/**
	 * Retorna o número de segundos entre duas data e hora.
	 * @param data1
	 * @param data2
	 * @return
	 */
	long segundosEntre(Date data1, Date data2);

	long diasEntre(Date data1, Date data2);

	String getShortDateTimePattern();

	Date clearTime(Date date);

	Date getDateAddDay(Date date, Integer daysToAdd);

	Date getActualDateAddWeek(Integer weeksToAdd);

	Date getActualDateAddMonth(Integer monthsToAdd);

}